package com.xbongbong.parent.interfaces;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.pojo.dto.FormDataUpdateDTO;
import com.xbongbong.paas.pojo.dto.ValidateDataDTO;
import com.xbongbong.paas.pojo.vo.FormDataUpdateVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.formdata.pojo.vo.BeforeUpdateVO;
import com.xbongbong.pro.formdata.pojo.vo.UpdateVO;

import java.util.List;
import java.util.Map;

/**
 * 更新操作接口
 * @author 吴峰
 * @date 2020/12/30 10:14
 * @since
 * @version
 */
public interface FormDataUpdateService<F, D> extends BusinessUpdateBeforeService<F, D>, BusinessUpdateAfterService<F, D>, FormDataUpdateWorkflowService<F, D> {

    /**
     * 更新数据，包含导入
     * @param formDataAddDTO
     * @return
     * @throws XbbException
     */
    FormDataUpdateVO updateAndImport(FormDataUpdateDTO formDataAddDTO) throws XbbException;

    /**
     * 更新数据
     * @param formDataAddDTO
     * @return
     * @throws XbbException
     */
    FormDataUpdateVO update(FormDataUpdateDTO formDataAddDTO) throws XbbException;


    /**
     * 导入数据
     * @param formDataAddDTO
     * @return
     * @throws XbbException
     */
    FormDataUpdateVO importData(FormDataUpdateDTO formDataAddDTO) throws XbbException;

    /**
     * 设置导入不能修改的数据
     * @param validateDataDTO
     * @param explainMap
     * @param oldData
     * @param newData
     * @param attrList 部分导入字段
     * @throws XbbException
     */
    void importSetData(ValidateDataDTO validateDataDTO, Map<String, FieldAttrEntity> explainMap, D oldData, JSONObject newData, List<String> attrList) throws XbbException;
    /**
     * 构造工厂
     * @return
     */
    List<Integer> businessType();

    /**
     * 保存之前的校验与解析操作
     * @param formDataUpdateDTO
     * @author 吴峰
     * @date 2020/12/30 16:49
     * @return
     * @throws XbbException
     */
    BeforeUpdateVO beforeSave(FormDataUpdateDTO formDataUpdateDTO) throws XbbException;

    /**
     * 新建保存入口
     * @param formDataUpdateDTO
     * @param beforeUpdateVO
     * @return com.xbongbong.pro.formdata.pojo.vo.SaveVO
     * @author 吴峰
     * @date 2021/2/23 15:51
     * @throws XbbException
     */
    UpdateVO update(FormDataUpdateDTO formDataUpdateDTO, BeforeUpdateVO beforeUpdateVO, F paasFormEntity, D paasFormDataEntity, D oldPaasFormDataEntity) throws XbbException;
    /**
     * 新建保存之后的逻辑，保存日志、触发业务规则等操作
     * @param formDataUpdateDTO
     * @param beforeUpdateVO 保存之前的方法返回的数据
     * @param updateVO 保存方法返回的数据
     * @return com.xbongbong.pro.formdata.pojo.vo.SaveVO
     * @author 吴峰
     * @date 2021/2/23 15:51
     * @throws XbbException
     */
    FormDataUpdateVO afterSave(FormDataUpdateDTO formDataUpdateDTO, BeforeUpdateVO beforeUpdateVO, UpdateVO updateVO, F paasFormEntity, D paasFormDataEntity, D oldPaasFormDataEntity) throws XbbException;
}
